/**
 * Classe Ordenação
 *
 * Essa classe é responsavel por ordenar os epitopos a partir de seu valor do
 * rank
 */
package epibot.testeProteinas;

import epibot.EstruturasBiologicas.Epitopo;
import epibot.EstruturasBiologicas.Proteina;
import java.util.ArrayList;

/**
 *
 * @author Rafael Tosta
 */
public class Ordenacao {

    /**
     * Converte uma lista de Proteinas em lista de Epitopo
     *
     * @param listaDeProteina Lista de Proteinas
     *
     * @return Lista de Epitopos
     */
    public ArrayList<Epitopo> converteTipoListaEpitopo(ArrayList<Proteina> listaDeProteina) {
        ArrayList<Epitopo> listaRank = new ArrayList<Epitopo>();
        for (int j = 0; j < listaDeProteina.size(); j++) {
            listaRank.addAll(listaDeProteina.get(j).getListaDeEpitopos());
        }

        return listaRank;
    }

    /**
     * Ordena o vetor de epitopos utilizando a tecnica QuickSort
     *
     * @param lista Lista de epitopos
     * @param primeiro Indice do primeiro da lista
     * @param ultimo indice do último da lista
     *
     * @return Lista ordenada
     */
    public ArrayList<Epitopo> quick(ArrayList<Epitopo> lista, int primeiro, int ultimo) {
        int baixo, alto, passa = 0;
        Epitopo temp;
        double separador_lista;
        baixo = primeiro;
        alto = ultimo;
        separador_lista = lista.get((primeiro + ultimo) / 2).getScoreAbsoluto();


        do {
            while (lista.get(baixo).getScoreAbsoluto() > separador_lista) {
                baixo++;
            }
            while (lista.get(alto).getScoreAbsoluto() < separador_lista) {
                alto--;
            }

            if (baixo <= alto) {
                temp = lista.get(baixo);
                lista.set(baixo++, lista.get(alto));
                lista.set(alto--, temp);
                passa++;
            }
        } while (baixo <= alto);
        if (primeiro < alto) {
            quick(lista, primeiro, alto);
        }
        if (baixo < ultimo) {
            quick(lista, baixo, ultimo);
        }

        return lista;
    }

    /**
     * Ordena vetor de epitopos geral utilizando QuickSort
     *
     * @param lista Lista de epitopos
     * @param primeiro Indice do primeiro da lista
     * @param ultimo indice do último da lista
     *
     * @return lista ordenada
     */
    public ArrayList<EpitopoGeral> quickGeral(ArrayList<EpitopoGeral> lista, int primeiro, int ultimo) {
        int baixo, alto, passa = 0;
        EpitopoGeral temp;
        double separador_lista;
        baixo = primeiro;
        alto = ultimo;
        separador_lista = lista.get((primeiro + ultimo) / 2).getScoreGlobal();


        do {
            while (lista.get(baixo).getScoreGlobal() > separador_lista) {
                baixo++;
            }
            while (lista.get(alto).getScoreGlobal() < separador_lista) {
                alto--;
            }

            if (baixo <= alto) {
                temp = lista.get(baixo);
                lista.set(baixo++, lista.get(alto));
                lista.set(alto--, temp);
                passa++;
            }
        } while (baixo <= alto);
        if (primeiro < alto) {
            quickGeral(lista, primeiro, alto);
        }
        if (baixo < ultimo) {
            quickGeral(lista, baixo, ultimo);
        }

        return lista;
    }
}
